{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## _*H2 ground state energy computation using Quantum Phase Estimation*_\n",
    "\n",
    "This notebook demonstrates using Qiskit Chemistry to compute ground state energy of the Hydrogen (H2) molecule using QPE (Quantum Phase Estimation) algorithm. Let's look at how to carry out such computation programmatically.\n",
    "\n",
    "This notebook has been written to use the PYSCF chemistry driver."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 1: Map problem to quantum circuits and operators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy.linalg import expm\n",
    "\n",
    "from qiskit_nature.second_q.drivers import PySCFDriver\n",
    "from qiskit_nature.second_q.mappers import ParityMapper\n",
    "from qiskit_nature.second_q.algorithms import GroundStateEigensolver\n",
    "from qiskit_nature.second_q.circuit.library import HartreeFock\n",
    "\n",
    "from qiskit_algorithms import NumPyMinimumEigensolver\n",
    "from qiskit_algorithms import PhaseEstimation\n",
    "\n",
    "from qiskit.primitives import Sampler\n",
    "from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister\n",
    "from qiskit.circuit.library import UnitaryGate\n",
    "from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\n",
    "from qiskit.visualization import plot_histogram\n",
    "\n",
    "from qiskit_ibm_runtime import SamplerV2\n",
    "from qiskit_ibm_runtime import QiskitRuntimeService"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We first set up the H2 molecule, create the fermionic and in turn the qubit operator using PySCF."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "driver = PySCFDriver(atom='H .0 .0 .0; H .0 .0 0.735', basis='sto3g')\n",
    "molecule = driver.run()\n",
    "hamiltonian = molecule.hamiltonian.second_q_op()\n",
    "mapper = ParityMapper(num_particles=molecule.num_particles)\n",
    "tapered_mapper = molecule.get_tapered_mapper(mapper)\n",
    "qubit_op = tapered_mapper.map(hamiltonian)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using a classical exact eigenvalue solver, we can establish the reference groundtruth value of the ground state energy:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The exact ground state energy is: -1.8572750302023788 Ha\n"
     ]
    }
   ],
   "source": [
    "exact_eigensolver = NumPyMinimumEigensolver()\n",
    "exact_eigensolver.filter_criterion = molecule.get_default_filter_criterion()\n",
    "gse = GroundStateEigensolver(mapper, exact_eigensolver)\n",
    "result = gse.solve(molecule)\n",
    "print(f'The exact ground state energy is: {result.eigenvalues[0]} Ha')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we set up the QPE algorithm instance using the HartreeFock initial state:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ground state energy from QPE: -1.8530487917658545 Ha\n"
     ]
    }
   ],
   "source": [
    "qpe = PhaseEstimation(9, Sampler())\n",
    "\n",
    "state_in = HartreeFock(molecule.num_spatial_orbitals, molecule.num_particles, tapered_mapper)\n",
    "U = UnitaryGate(expm(1j*qubit_op.to_matrix()))\n",
    "\n",
    "result = qpe.estimate(U, state_in)\n",
    "\n",
    "print(f'Ground state energy from QPE: {(result.phase - 1) * 2*np.pi} Ha')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As can be easily seen, the QPE computed energy is quite close to the groundtruth value we computed earlier."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 2: Optimize for target hardware"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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r7yizz//XBdffLGSk5OVnJystLS0ypZbaSar1Wqt8aMC55g6daqWLVumI0eOyNPTU2FhYbrzzjs1adIkmc1mZ5cHAABgSLm5eXrjk8U6eepMiW2aNwvQ/eNHyNW14u+5fvjhBz3++OPas2ePAgMDNWXKFP373/++kJKr3M9rt2jNxj9KXG8ymfSPW6+vcKCXpF9//VUDBgwotrxfv3769ddfK7y/6pByPFVvfvqtfVZjRy7t2l4jh1xZof2W9EHB7bffrk8++aRC+7pQBFoYhsViUdyhJLUJCTL8zfoAAAA14dCRFL07b6kcveU3m130r9tHKrBpYydUVjPyCwr0zudLdDTlpMP1/S+P1JB+l9ZwVTVr3ZYd+mH1JofrAvz99MDEUfJwd6vhqqoOQ45hGNt3H9AHC3/Qp4t/LrsxAAAAFNziIg24PNLhusFXXlqnw6wkuZrNuvm6gXJ1MOqvebMADep7iROqqll9enRWWHBQseUmk0ljhvU3dJiVCLQwCIvFol82REuSQlpc5ORqAAAAjOOqPpeoRWCTIstat2quvj07O6mimnVRk0bFemELg+4Ah0G3rnEpIbj2v7yrQiox1Lq2IdAajMlksg+3XbZsmQYNGqSAgACZTKYiY/VzcnL0xhtvqHfv3vL395enp6cuvvhiPfzwwzpx4oTDfe/evVsTJkxQSEiI3N3d5efnp7CwMI0YMUJffPFFTZxeibbvPqATqWny9vRQr+4RTq0FAADASMxmF908bID9PtnCx7r0l0s9uoWrd49OahPydy/l4Ct71vne6XP5+/nqhqv72L8PuihAV/WpG73TBFqD+s9//qPhw4dr+/btatOmjVq0aGFfl5KSol69eunBBx/U5s2b5e/vr/DwcCUkJGjOnDm65JJLFBcXV2R/W7duVY8ePfT555/rxIkTuvjii9WmTRudOXNG3333nV544YWaPkW7c3tnr7i0izwrMKU8AAAApGZNGunafpdJkoYP6qNGDRs4uaKa5WIy6aah/eXp4a6w4CD1qSe90+fqFtFOnS9uXeowbCNiUiiDsfXOuru769VXX9XkyZPl4uIiq9Wq3Nxcubu7a8CAAYqKitKwYcP01ltvKTQ0VFLh1OJTpkzRRx99pF69emnDhg32/Q4fPlzLli3T7bffrrfeeku+vr72dXv37tXq1as1efLkCtf75qff6Gx61gWdc15+vrKyc2SS5OvrLZPqz6eJAAAAVcVqtSo3L1/ubq71doLNvPx8mV1c5OJSP/v1LFar8vPz5e5Wu+6bbeDrpX/dPrJS2xJoDcb2y+f+++/XW2+9VWz9jz/+qGHDhqlTp07asmWLPD09i6wvKCjQpZdequjoaK1fv159+hQOPWjfvr327t2r7du3q0uXLlVW78y35+lMekaV7Q8AAABA3eLn66PH7x9XqW1dq7gW1JA77rjD4fLFixdLKnwG1PlhVpLMZrOGDx+u6Oho/frrr/ZA26pVK+3du1eLFi1S586dq+xTuwa+5X9AsyP0zgIAAAB124VkBnpoDcYWNNPT0+Xj41Nsfc+ePbV161Z17NhRjRo1criPlJQU7d+/X5MnT9Y777wjSVq+fLmGDRsmq9Wq4OBgDRkyRFdccYUGDBhQ5P7cmmSxWPTah1/reGqaBl/ZUwN6dXNKHQAAAABqJwKtwdgCbUkvW7t27bR///5y7ev222/XJ598Yv9+xYoVeuGFF/Tbb7/JYrHYjzdw4EC9/vrr6tSpU4XrvZB7aOmdBQAAAOq+C7mHliHHdYxtMqelS5fq+uuvr9C211xzja655hqlpaXpt99+06+//qr58+frl19+0aBBg7Rz504FBARUaJ9n07Mu+B5aq6Sz6ZkXtA8AAAAAdQ+Bto6JiIhQTEyM/vrrrwoHWpuGDRtq6NChGjp0qJ566il17dpVcXFxWrp0qSZOnFihfVV2PDy9swAAAED9cCH30BJo65jRo0dr3rx5+u9//6t//etfRR6/Uxm+vr7q0qWL4uLidPTo0QpvX5mhA7Z7Z7Oyc3QN984CAAAAKEH9fABTHXbDDTeoX79+OnjwoK655hr99ddfRdZbLBZt3LhRkyZNUlxcnH35zTffrKVLlyonJ6dI+zVr1mjVqlWSpEsuuaT6T0DSjj1xOp6aJm9PD/XqHlEjxwQAAABgPEwKZTBlTQolSSdOnNANN9ygDRs2SJJCQkIUGBiorKwsHThwQBkZhfe07t69W+3bt5ck+fv7Ky0tTe7u7mrbtq18fX2VlJSkw4cPS5JuueUWffnll9V5apKY2RgAAABA+RFoDaY8gVaS8vPzNW/ePM2bN09//PGHTp06JW9vb4WFhal///4aOXKk+vbtKxeXwk767777Tj/99JM2bNigo0eP6vTp0/Lz81NkZKTuuOMO3XbbbVX2bNrSZGXn6LuVv2lffKIe/sct8vRwr/ZjAgAAADAmAi1qpeycXMIsAAAAgFIRaAEAAAAAhsSkUAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADAkAi0AAAAAwJAItAAAAAAAQyLQAgAAAAAMiUALAAAAADCk/wdI3zVXq7Zp1gAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1206.14x451.5 with 1 Axes>"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_result_bits = 3\n",
    "qpe = PhaseEstimation(num_result_bits, Sampler())\n",
    "\n",
    "qr1 = QuantumRegister(num_result_bits, 'control')\n",
    "qr2 = QuantumRegister(1, 'target')\n",
    "cr = ClassicalRegister(num_result_bits, 'res')\n",
    "circuit = QuantumCircuit(qr1, qr2, cr)\n",
    "circuit.compose(qpe.construct_circuit(U, state_in), inplace=True)\n",
    "circuit.measure(qr1, cr)\n",
    "circuit.decompose().draw('mpl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ibm_sherbrooke\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "OrderedDict([('rz', 76), ('sx', 50), ('ecr', 16), ('measure', 3)])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "service = QiskitRuntimeService(channel=\"ibm_quantum\")\n",
    "backend = service.least_busy(operational=True, simulator=False)\n",
    "print(backend.name)\n",
    "target = backend.target\n",
    "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
    "\n",
    "isa_circuit = pm.run(circuit)\n",
    "isa_circuit.count_ops()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 3: Execute on target hardware"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "sampler = SamplerV2(mode=backend)\n",
    "\n",
    "job = sampler.run([isa_circuit]).result()\n",
    "\n",
    "id = job.job_id()\n",
    "print(id)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit_ibm_runtime import QiskitRuntimeService\n",
    "\n",
    "service = QiskitRuntimeService()\n",
    "job = service.job(id)\n",
    "job_result = job.result()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 4: Post-process results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\" best possible result using 3 bits:\n",
    "phi = 0.c1c2c3 can be: 0 _ 0.125 _ 0.25 _ 0.375 _ ... _ 0.875\n",
    "=> 2pi*(phi - 1) can be: ~ -6.28 _ -5.50 _ -4.71 _ ... _ -2.36 _ -1.57 _ -0.79 _ ... _ 0\n",
    "So the closest result is -1.57, which corresponds to phi = 0.75 (= 0.110 in binary)\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAGtCAYAAAACveA9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLJUlEQVR4nO3deVhU5f8+8HtmWEUBGVmTzQ0QUdwDWkRxJU1zKTVFM01TK0lTyzXX6mNaaZplYmku5ZIZuaLiAogLuWZKuIGoiCyC4MA8vz/8MV8nDgY4cGC4X9c11+U852HO+80Z4ebMWRRCCAEiIiIi0qOUuwAiIiKiqoghiYiIiEgCQxIRERGRBIYkIiIiIgkMSUREREQSGJKIiIiIJDAkEREREUlgSCIiIiKSYCJ3AdWVVqtFSkoK6tSpA4VCIXc5REREVApCCGRnZ8PFxQVK5ZP3FTEklVNKSgpcXV3lLoOIiIjK4fr166hfv/4T5zAklVOdOnUAPPomW1tby1wNERERlUZWVhZcXV11v8efhCGpnIo+YrO2tmZIIiIiqmZKc6gMD9wmIiIiksCQREQVKjo6Gj179oSLiwsUCgW2bdumt3zWrFnw9vaGlZUV6tati5CQEMTFxUm+Vn5+Pvz9/aFQKJCQkKD3GgqFotjDysqqAjsjImPHkEREFSonJwctWrTAsmXLJJc3adIES5cuxZkzZ3D48GF4eHigS5cuuHPnTrG5H3zwAVxcXIqNT5w4ETdv3tR7NG3aFP379zd4P0RUcyiEEELuIqqjrKws2NjYIDMzk8ckEZWSQqHA1q1b0bt37xLnFP3f2rt3Lzp16qQb/+OPPxAeHo7NmzfD19cXp06dgr+/v+Rr/Pnnn/D390d0dDSef/55A3dBRNVZWX5/88BtIqoyHj58iJUrV8LGxgYtWrTQjd+6dQsjR47Etm3bUKtWrf98ne+++w5NmjRhQCKip8KP24hIdjt27EDt2rVhYWGBxYsXY8+ePahXrx6ARxd+GzZsGEaPHo02bdr852vl5eVh3bp1GDFiREWXTURGjiGJiGQXHByMhIQEHD16FN26dcOAAQNw+/ZtAMBXX32F7OxsTJ06tVSvtXXrVmRnZyMsLKwiSyaiGoAhiYhkZ2VlhUaNGuHZZ5/FqlWrYGJiglWrVgEAoqKiEBMTA3Nzc5iYmKBRo0YAgDZt2kgGoe+++w4vvfQSHB0dK7UHIjI+PCaJiKocrVaL/Px8AMCXX36JuXPn6palpKSga9eu2LhxI9q3b6/3dUlJSdi/fz+2b99eqfUSkXFiSCKiCnX//n1cvnxZ9zwpKQkJCQmws7ODWq3GvHnz0KtXLzg7OyMtLQ3Lli1DcnKy7vR9Nzc3vderXbs2AKBhw4bF7rv0/fffw9nZGd27d6/groioJmBIIqIKdfz4cQQHB+ueh4eHAwDCwsKwYsUK/PXXX1izZg3S0tKgVqvRtm1bHDp0CL6+vmVaj1arRUREBIYNGwaVSmXQHoioZuJ1ksqJ10kiIiKqfsry+5sHbhMRERFJYEgiIiIiksCQRERERCSBIYmIiIhIAkMSERERkQSGJCIiIiIJDElEREREEhiSiIiIiCQwJBERERFJYEgiIiIiksCQRERERCSBIYmIiIhIAkMSERERkQSGJCIiIiIJDElEREREEhiSiIiIiCQwJBERERFJYEgiIiIikmAidwFEZPw8pvwuy3qvLAyVZb1EZBy4J4mIiIhIAkMSERERkQSGJCIiIiIJDElEREREEhiSiIiIiCQwJBERERFJYEgiIiIiksCQRERERCSBIYmIiIhIAkMSERERkQSGJCIiIiIJDElEREREEhiSiIiIiCQwJBERERFJYEgiIiIiksCQRERERCSBIYmIiIhIAkMSERERkQSGJCIiIiIJDElEREREEhiSiIiIiCQwJBERERFJYEgiIiIiksCQRERERCSBIYmIiIhIAkMSERERkQSGJCIiIiIJDElEREREEhiSiIiIiCQwJBERERFJYEgiIiIiksCQRERERCShyoWk6Oho9OzZEy4uLlAoFNi2bZtumUajweTJk+Hn5wcrKyu4uLhg6NChSElJ0XuN9PR0DB48GNbW1rC1tcWIESNw//59vTmnT5/G888/DwsLC7i6uuLTTz+tjPaIiIiomqhyISknJwctWrTAsmXLii3Lzc3FyZMnMX36dJw8eRJbtmzBxYsX0atXL715gwcPxrlz57Bnzx7s2LED0dHRGDVqlG55VlYWunTpAnd3d5w4cQKfffYZZs2ahZUrV1Z4f0RERFQ9KIQQQu4iSqJQKLB161b07t27xDnx8fFo164drl69Cjc3N1y4cAFNmzZFfHw82rRpAwDYuXMnevTogRs3bsDFxQXLly/HRx99hNTU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unULVlZWUCgU+Pzzz8v0Rw0REekrU0hycXHB2bNnSz3/7NmzeOaZZ8pcFPHiezXZ/fv3kZiYiCFDhiA3NxcAiv2xoVKpoNVqi32to6MjAOD777+HhYUFOnfuXPEFExEZqTLt5nn++ecRFRVV7L5gUq5cuYKoqCi88MIL5a2NqEaYOHEiDh48iCtXruDo0aPo06cPVCoVBg4cCG9vbzRq1AhvvfUWjh07hsTERCxatAh79uxB7969da+xdOlSnDx5En///TeWLVuGcePGYcGCBbC1tZWtLyKi6q5MIWns2LHQaDTo168f0tLSSpx39+5d9O/fHwUFBRgzZsxTF0lkzG7cuIGBAwfCy8sLAwYM0F3N3t7eHqampoiMjIS9vT169uyJ5s2b44cffsCaNWvQo0cP3WscO3YMnTt3hp+fH1auXIlvvvkG77zzjoxdERFVf2X6uK1Vq1Z47733sGTJEjRt2hSjR49GcHAw6tevDwBITk7Gvn37sHLlSty5cwfh4eFo1apVhRROZCw2bNjwxOWNGzcudoXtf/vhhx8MWRIREaEc925btGgRLCws8Nlnn2HevHmYN2+e3nIhBFQqFaZOnYq5c+carFAiIiKiylTmkKRQKDB//nyMGDECq1evxtGjR5GamgoAcHJyQlBQEIYNG4aGDRsavFgiIiKiylLu8/MbNmyIuXPnIioqCufPn8f58+cRFRWFOXPmVHhASk5Oxuuvvw61Wg1LS0v4+fnh+PHjuuVCCMyYMQPOzs6wtLRESEgILl26pPca6enpGDx4MKytrWFra4sRI0bwhqBERESkU+0uYnTv3j0EBQXB1NQUf/zxB86fP49Fixahbt26ujmffvopvvzyS6xYsQJxcXGwsrJC165dkZeXp5szePBgnDt3Dnv27MGOHTsQHR2NUaNGydESERERVUFl/rhNbp988glcXV317gnn6emp+7cQAkuWLMG0adPw8ssvA3h0UKujoyO2bduG1157DRcuXMDOnTsRHx+PNm3aAAC++uor9OjRA//73//g4uJSuU0RERFRlVPt9iRt374dbdq0Qf/+/eHg4ICWLVvi22+/1S1PSkpCamoqQkJCdGM2NjZo3749YmJiAAAxMTGwtbXVBSQACAkJgVKpRFxcXOU1Q0RERFVWtduT9M8//2D58uUIDw/Hhx9+iPj4eLzzzjswMzND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MlRneOyX/RpTv0I8uh7UmDFjRGJiopg7d67w8PAQCoVCtGrVSixYsECcPHlSfP/998LExETuUg2ipvUrRM3r2Vj7ZUiqpo4ePSr8/f1FUFCQWLt2rUhJSRG5ublCiEenUffv318MGjRI5ioNh/2yX2PpV6PRiHnz5ompU6fqjf/5559i1KhRwsbGRtSuXVuYmpqK4cOHy1Sl4dS0foWoeT0bc78MSdXY6dOnRf/+/YWFhYWoV6+e6N27txg9erTw9PQUbdu2FX/++afcJRoU+2W/xuLevXvir7/+EkIIkZ+fX2zv2dq1a4VCoRAJCQlylGdwNa1fIWpez8baLw/cNgK3b9/Gjh07sG3bNlhaWqJZs2bo168ffHx85C6tQrBf9muMtFothBBQqVT49ttv8e677yI3N1fusipMTesXqHk9G0O/DElGxhjuEl4W7Ne41bR+i3z++ecoLCzEpEmT5C6lUtS0foGa13N17ZchiYioitFoNFCpVDUmINa0foGa13N17ZchiYiIiEhC9Yp0RERERJWEIYmIiIhIAkMSERERkQSGJCIiIiIJDElEREREEhiSiIiIiCQwJBERERFJYEgiIiIiksCQRERERCTh/wFqAdok9unbOwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "counts = job_result[0].data.res.get_counts()\n",
    "plot_histogram(counts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "phi = 0.75 => best approximation with 3 bits = -1.57 Ha\n"
     ]
    }
   ],
   "source": [
    "# get the most frequent result\n",
    "max_key, max_value = max(counts.items(), key=lambda x: x[1])\n",
    "\n",
    "phi = int(max_key[::-1], 2) / 8 # I have to reverse the string with this circuit because the first is the least significative bit, etc.\n",
    "                                # in fact, if you look at the plot of the circuit used here: https://learning.quantum.ibm.com/course/fundamentals-of-quantum-algorithms/phase-estimation-and-factoring#general-procedure-and-analysis\n",
    "                                # you can see that the inverse QFT has the number in reverse order as the circuit here.\n",
    "print(f'phi = {phi} => best approximation with 3 bits = {2*np.pi * (phi - 1):.2f} Ha')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "qiskit==1.1.0\n",
      "qiskit-aer==0.14.2\n",
      "qiskit-algorithms==0.3.0\n",
      "qiskit-ibm-runtime==0.25.0\n",
      "qiskit-machine-learning==0.7.2\n",
      "qiskit-nature==0.7.2\n",
      "qiskit-nature-pyscf==0.4.0\n",
      "qiskit-qasm3-import==0.5.0\n",
      "qiskit-transpiler-service==0.4.5\n"
     ]
    }
   ],
   "source": [
    "! pip freeze | grep qiskit"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
